package com.miles.test;

import com.miles.Mapper.RoleMapper;
import com.miles.Mapper.UserMapper;
import com.miles.util.MybatisUntil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserTester {
    //一对多
    @Test
    public void selectByUserID (){

        //二级缓存作用在同一个Mapper中  范围是namespace 级别的，可以被多个SqlSession 共享（只要是同一个接口里面的相同方法，都可以共享）
        //二级缓存作用的Mapper下的 用到的类 需要序列化   User  Role implements Serializable
        SqlSession sqlSession1 = MybatisUntil.getSqlSession();
        SqlSession sqlSession2 = MybatisUntil.getSqlSession();

        UserMapper mapper =sqlSession1.getMapper(com.miles.Mapper.UserMapper.class);
        User user = mapper.selectByUserID(1);
        sqlSession1.close();
        System.out.println("=========================");

        UserMapper mapper2 = sqlSession2.getMapper(com.miles.Mapper.UserMapper.class);
        User user2 = mapper2.selectByUserID(1);
        System.out.println(user==user2);
        sqlSession2.close();
        for (Role r:user.getRoles()) {
            System.out.println(user.getId()+"=="+user.getName()+"=="+r.getRolename());
        }
    }

    //多对一
    @Test
    public  void selectRolesAndUser(){
        RoleMapper mapper = MybatisUntil.getSqlSession().getMapper(RoleMapper.class);
        //一级缓存 作用在一个SqlSession范围  SqlSession执行完 就会关闭close
        //一级缓存 执行期间失效的情况：查询不同的东西 不在一个sqlsession范围内
        //增删该操作 可能会改变原来的数据  所以会刷新缓存
        //查询不同的mapper 同  查询不同的东西
        //手动清理缓存   MybatisUntil.getSqlSession().clearCache();

        //一次查询的数据会被缓存 再次调用  会在缓存中找数据不会再次执行sql
        List<Role> roles = mapper.selectRolesAndUser();
        System.out.println("=====");
        List<Role> roles1 = mapper.selectRolesAndUser();
        //缓存为同一个对象
        System.out.println(roles1==roles);
        for (Role r:roles) {
            System.out.println(r.getId()+"=="+r.getRolename()+"=="+r.getUser().getId()+"=="+r.getUser().getName());
        }
        MybatisUntil.getSqlSession().clearCache();
    }
}
